#include <future>
#include <condition_variable>
#include <mutex>
#include <iostream>
#include <thread>
//std::mutex mtx;
//std::condition_variable cond;
//调用子线程的返回结果的实现方法
//当然，c++委员会给了我们更简便的方法
//future和promise
//进一步，给我们封装成了std::async();用法和线程一样，但是可以返回东西，返回的是std::future<东西>
void task(int a, int b, std::promise<int> &ret)
{
    int ret_a = a * a;
    int ret_b = b * 2;
    
    ret.set_value(ret_a + ret_b); //promise设置完值后，future可以立马获得值，不用等到线程结束
    
}


int main()
{
    std::promise<int> p;
    std::future<int> f = p.get_future();
    std::thread t(task, 1, 2, std::ref(p));
  
    std::cout << f.get() << std::endl;//会阻塞在这里，直到子线程结束
    //future.get只能进行一次
    //shared_future<>可以进行复制，
    //可以在多个线程的时候使用shared_future作为参数，
    //这时传值，每个线程都会有一份
    
    t.join();
    return 0;
}